#文件用途：处理目录(路径、文件名),时间和系统相关
from pathlib import Path
import os
import time
import re
import sys
import torch
import pandas as pd

def ensure_dir(dirname):
    """确保生成目录-由目录"""
    dirname = Path(dirname)
    if not dirname.exists():
        dirname.mkdir(parents=True, exist_ok=False)

def str2mkdirs(output_file):
    """功能：由str生成目录-自动去除文件名；
    优点：str可以带文件名；
    调用：str2mkdirs('zz/file4.txt')
    """
    #由str生成目录-判断目录是否存在
    # 从文件名中提取路径（不带文件名）-截取最后一个分隔符的左边
    write_folder=output_file.rsplit('/',1)[0]
    # print(write_folder)
    # sys.exit()
    # 如果路径不存在，就创建它,并且不把文件名创建为目录
    if not os.path.exists(write_folder) and '.' not in write_folder:
        os.makedirs(write_folder)
        print(f"{write_folder}:生成成功！")
# str2mkdirs('zz/file4.txt')
# str2mkdirs('zz')

# if os.path.exists('config.py'):
#     print("文件存在")

def get_time_date():
    """
    功能：取当前时间日期-结构化；
    返回：
    struct_time:    time.struct_time(tm_year=2022, tm_mon=10, tm_mday=18, tm_hour=3, tm_min=16,
    tm_sec=13, tm_wday=1, tm_yday=291, tm_isdst=0)
    time_data_name  2022_10_18_3_21_30
    """
    start_time = time.time()#秒时间
    struct_time = time.gmtime(start_time)
    # print("start_time:",start_time,"/nstruct_time:",struct_time)
    time_data_name = '{}_{}_{}_{}_{}_{}'.format(
        struct_time.tm_year,
        struct_time.tm_mon,
        struct_time.tm_mday,
        struct_time.tm_hour,
        struct_time.tm_min,
        struct_time.tm_sec)
    return struct_time,time_data_name


def get_timestamp_now_str():
    """
    功能：取当前时间戳str；
    调用：print(type(get_timestamp_now_str()))"""
    import datetime
    # 获取当前日期和时间
    now = datetime.datetime.now()
    # 将日期和时间格式化为字符串
    timestamp = now.strftime("%Y-%m-%d_%H-%M-%S")
    # print(timestamp)
    return timestamp



def abs_file_path_timename(foldername='checkpoints'):
    """
    功能：生成文件绝对路径-用时间命名文件名（当前绝对路径下-指定文件夹名）
    参数：    foldername: 当前目录下文件夹
    返回：
        CHECKPOINT_PATH:     绝对路径（含文件名）
        save_file_name:     文件名（如checkpoints_2022_10_18_3_27_37）
    """
    struct_time,time_data_name=get_time_date()
    save_dir = Path(__file__).parent.absolute()##取绝对目录-当前文件所在目录
    save_file_name=f'{foldername}_{time_data_name}'
    # print(save_dir)
    CHECKPOINT_PATH = os.path.join(save_dir, 'checkpoints', save_file_name)#
    # print("CHECKPOINT_PATH:",CHECKPOINT_PATH)
    return CHECKPOINT_PATH,save_file_name


def abs_folder_file_path(foldername,filename)->str:
    """
    功能：文件绝对路径（当前绝对路径下-指定文件夹下）
    参数：
        foldername: 当前目录下文件夹
        filename：文件名
    返回：str
    调用：
        s1="/home/data/embeddings/bert-wwm-chinese"
        filepath = abs_folder_file_path(s1,'name.txt')#
        print(filepath)
    """
    # import sys
    # sys_type=sys.platform#系统类型：linux or win32
    save_dir = str(Path(__file__).parent.absolute())##取绝对目录-当前文件所在目录
    # print(save_dir)
    # filepath = os.path.join(save_dir,foldername, filename)
    # #第2元首元不要带/，否则会截断前面路径-从前面的第一个斜线拼接)
    if foldername[0]=='/':
        filepath=save_dir+foldername+filename
    else:
        if foldername[-1]=='/':
            filepath = save_dir +'/'+ foldername + filename
        else:
            filepath = save_dir + '/' + foldername +'/'+ filename
    # print("CHECKPOINT_PATH:",CHECKPOINT_PATH)
    return filepath

# s1="/home/data/embeddings/bert-wwm-chinese"
# filepath = abs_folder_file_path(s1,'')#
# print(filepath)


def abs_path_name(filename='ck.txt'):
    """str->str
    功能：返回绝对路径（含文件名）
    """
    save_dir = Path(__file__).parent.absolute()##取绝对目录-当前文件所在目录
    # print(save_dir)
    filepath = os.path.join(save_dir, filename)#
    # filepath=str(save_dir)+'/'+filename
    return filepath
# print(abs_path_name(''))

def dir_current_parent():
    """
    功能：取当前文件所在目录(绝对目录)，取父目录
    """
    current_dir = Path(__file__).parent.absolute()
    parent_dir=current_dir.parent
    print(parent_dir)
    return current_dir,parent_dir

def absdir_filelist_print():
    """功能：查看当前目录下所有文件list"""
    abs_dir = Path(__file__).parent.absolute()
    file_list=os.listdir(abs_dir)
    print("file_list:",len(file_list),file_list)
    return file_list

# 定义要创建的目录
# mkpath = "web/"
# # 调用函数：mkdir(mkpath)

def str_windows_name(str1:str)->str:
    """
    功能：str处理为复合windows命名规则；
    调用：
        str1='testrun_28< > /  | :   ]09_2022_14:41:39'
        print(str_windows_name(str1))#testrun_28_09_2022_14_41_39
    """
    str1=str1.replace(' ','')#去除空格
    str2='<>/|:]'.replace(' ','')#windows命名规则不符的字符-还有*和?
    for i in str2:
        str1=str1.replace(i,'_')
    str1=str1.replace('/*',"").replace('/?','').replace('//','_')#通配符的替换
    str1=re.sub(r'_+','_',str1)#替换多个连续字符为一个
    return str1


def mk_folder(path):
    """
    功能：当前目录下-生成指定path的目录
    优点：path开头为/路径也不会出问题
    调用：
        dirname='/checkpoints/ck'
        mk_folder(dirname)
    """
    # 引入模块
    import os
    # 去除首位空格
    if type(path)==str:
        path = path.strip()
        # 去除尾部 / 符号
        path = path.lstrip("/")  # 去除首元/符号

        path = path.rstrip("//")  # 去除尾部 / 符号
        path = path.rstrip("/")
        path = path.lstrip("//")
        # 判断路径是否存在
        # 存在     True
        # 不存在   False
        isExists = os.path.exists(path)
        # 判断结果
        if not isExists:
            # 如果不存在则创建目录
            # 　  # 创建目录操作函数
            os.makedirs(path)
            print
            path + ' 创建成功'
            return True
        else:
            # 如果目录存在则不创建，并提示目录已存在
            print
            path + ' 目录已存在'
            return False
    # elif type(path)==WindowsPath:


def mkfile(dirname:str,filename:str):
    """
    功能：当前目录的指定目录名下-生成文件；
    return:文件对象
    调用：
        dirname="data"#目录名
        filename="dict.txt"#文件名
    """
    # mkdir(dirname)  # 创建目录
    filename=str_windows_name(filename)#处理文件名-满足windows命名规则
    import os
    # 去除首位空格
    dirname = dirname.strip()
    dirname = dirname.lstrip("/")#去除首元/符号

    dirname = dirname.rstrip("//")# 去除尾部 / 符号
    dirname = dirname.rstrip("/")
    dirname = dirname.lstrip("//")

    # if dirname.find('/')==0:
    #     print("路径首元为/")
    #     sys.exit()
    if dirname == "":
        return False
    # 判断路径是否存在
    # 存在     True
    # 不存在   False
    isExists = os.path.exists(dirname)
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        # 　  # 创建目录操作函数
        os.makedirs(dirname)
        print(dirname + ' 创建成功')
        return True
    else:
        # 如果目录存在则不创建，并提示目录已存在
        print(dirname + ' 目录已存在,不再重复创建！')

    save_dir = Path(__file__).parent.absolute()  # 当前所在目录
    fdir = os.path.join(save_dir, dirname, filename)  # 连接目录
    file = open(fdir, 'w')
    print(fdir, "创建成功")
    file.close()
    return file

def get_file_type(file_path):
    """
    功能：取文件扩展名（文件类型）
    file_path = "example 1 2.txt"
    file_type = get_file_type(file_path)
    print(file_type)  # 输出: .txt"""
    file_extension = os.path.splitext(file_path)[1]#将文件路径分割为两部分：文件名和扩展名
    return file_extension


def win_liunx_plat():
    """功能：判断当前系统平台，是windows则返回1
    调用：print(f"system platform status:{win_liunx_plat()}")
    """
    if sys.platform.startswith('win'):
        return 1
    else:
        return 0


def str_rename_test():
    """功能：文件重命名；（替换实现）"""
    input_name = 'data/file1.txt'
    output_name = input_name.replace('.txt', '_str.txt')
    print(output_name)


def get_curr_dir_test():
    """功能：取当前所在目录、父目录等"""
    import os
    print(os.getcwd())  # 获得当前工作目录
    print(os.path.abspath('.'))  # 获得当前工作目录#<class 'str'>
    print(type(os.path.abspath('.')))
    print(os.path.abspath('..'))  # 获得当前工作目录的父目录
    print(os.path.abspath(os.curdir) ) # 获得当前工作目录
    abs_dir=Path(__file__).parent.absolute()#当前文件所在目录<class 'pathlib.WindowsPath'>
    print(f'abs_dir:{abs_dir},{type(abs_dir)}')
    save_path = os.path.join(abs_dir,'checkpoints', 'a.txt')#E:/checkpoints/a.txt#第2元首元不要带斜线


def save_dir_structure_to_excel(root_dir: str, output_excel: str = "directory_structure.xlsx"):
    """
    功能：递归遍历指定目录，将所有文件和文件夹的相对路径及文件名保存到Excel中
    特点：不显示不包括文件的文件夹
    列：所在文件夹（相对路径）、文件名；
    
    参数:
        root_dir: 要遍历的根目录路径
        output_excel: 输出的Excel文件名
        
    示例:
        save_dir_structure_to_excel("./my_project", "file_structure.xlsx")
    """
    import pandas as pd
    from pathlib import Path

    results = []
    root_path = Path(root_dir)
    
    for path in root_path.rglob("*"):
        # 只处理文件，跳过文件夹
        if path.is_file():
            rel_path = str(path.relative_to(root_path).parent)
            if rel_path == ".":
                rel_path = "."
                
            results.append({
                "所在文件夹": rel_path,
                "文件名": path.name
            })
    
    df = pd.DataFrame(results)
    df.to_excel(output_excel, index=False)
    print(f"目录结构已保存到: {output_excel}")

if __name__=='__main__':
    # 遍历指定目录并保存结果
    # 遍历指定目录并保存结果
    save_dir_structure_to_excel("E:/天星科技发展有限公司/天星202412的工作汇总/项目路演与本子头脑风暴/项目ppt路演/第一周ppt汇总/修改后版本ppt-28本",   "project_structure.xlsx")

